Skip to content

feat: MCPB desktop extension for sem-ai#63

Open
skipi wants to merge 1 commit into
mainfrom
mk/sem-ai/mcpb-extension
Open

feat: MCPB desktop extension for sem-ai#63
skipi wants to merge 1 commit into
mainfrom
mk/sem-ai/mcpb-extension

Conversation

@skipi

@skipi skipi commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

What

Package the sem-ai mcp stdio server as a one-click MCPB (MCP Bundle) desktop extension. Claude Desktop (and other MCPB-aware apps) install a .mcpb, the user enters their org host + API token in the install dialog, and the app launches sem-ai mcp for them — no terminal, no go install, no ~/.sem.yaml editing. Same server the Claude Code / Codex plugin already uses; MCPB is just a different delivery wrapper around it.

How it works

The bundle injects the user's config as environment variables, which config.Load() now reads (env wins over ~/.sem.yaml, so the same vars also configure the plain CLI in CI):

Manifest user_config Env var
host SEMAPHORE_HOST
api_token (sensitive → OS keychain) SEMAPHORE_API_TOKEN

At runtime Claude Desktop runs server/sem-ai mcp with those env vars set; the cobra tree is exposed as MCP tools over stdio, exactly as today.

Packaging

One bundle ships per OS+arch — MCPB platform_overrides keys on OS only, not CPU architecture. scripts/pack-mcpb.sh runs after GoReleaser in the release pipeline: it downloads each published release archive, drops the binary under server/, zips it with manifest.json at the root, and uploads the .mcpb files back to the tag. Packing runs after publish and is idempotent (--clobber), so a bundling hiccup never blocks or corrupts the CLI release — just re-run scripts/pack-mcpb.sh <tag>.

mcpb/manifest.json is version-synced as a 4th manifest via scripts/release.sh and guarded by scripts/check-manifest-versions.sh, so the bundle version can never drift from the CLI / plugin version.

Testing

  • pkg/config/config_test.go: file-context, env-only, env-overrides-file, blank-env-falls-back — all pass.
  • Built a bundle locally and drove an MCP initialize handshake through the bundled binary — returns the expected serverInfo.
  • Official mcpb validate mcpb/manifest.json passes the schema.
  • bash -n on all scripts; check-manifest-versions.sh and release.sh --dry-run exercised with the new 4th manifest.

🤖 Generated with Claude Code

@github-actions github-actions Bot added the enhancement New feature or request label Jun 19, 2026
@skipi skipi force-pushed the mk/sem-ai/mcpb-extension branch 2 times, most recently from c094dcd to 33c40ad Compare June 19, 2026 09:56
Bundle the `sem-ai mcp` stdio server as a one-click MCPB (.mcpb) extension
for Claude Desktop and other MCPB-aware apps.

- config: SEMAPHORE_HOST / SEMAPHORE_API_TOKEN env vars override ~/.sem.yaml,
  so the install dialog can inject credentials (token kept in the OS keychain)
  and the same vars configure the CLI in CI.
- mcpb/manifest.json: binary server type, user_config (host + sensitive token)
  mapped to env, win32 .exe platform override.
- packaging is folded into GoReleaser: a build post-hook runs the official
  `mcpb pack` (scripts/mcpb-pack.sh) on each freshly built binary, and
  release.extra_files attaches dist/*.mcpb to the release — one bundle per
  OS+arch (platform_overrides keys on OS, not arch). The post-hook skips
  snapshot builds (the -next suffix), so PR/snapshot pipelines stay node-free;
  only the release job installs mcpb and packs.
- `make mcpb` builds a local bundle for the current platform into dist/.
- CI: PR pipeline validates mcpb/manifest.json via `mcpb validate`.
- version-synced as a 4th manifest via release.sh + check-manifest-versions.sh.
- install.sh points Claude Desktop users to the bundle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@skipi skipi force-pushed the mk/sem-ai/mcpb-extension branch from 33c40ad to 311dafb Compare June 19, 2026 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant